Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Erasure code</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Erasure_code"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Erasure_code rootpage-Erasure_code skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Erasure code</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */


.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style>

<p>In <a href="Coding_theory" title="Coding theory">coding theory</a>, an <b>erasure code</b> is a <a href="Forward_error_correction" class="mw-redirect" title="Forward error correction">forward error correction</a> (FEC) code under the assumption of bit erasures (rather than bit errors), which transforms a message of <i>k</i> symbols into a longer message (code word) with <i>n</i> symbols such that the original message can be recovered from a subset of the <i>n</i> symbols. The fraction <i>r</i>&nbsp;=&nbsp;<i>k</i>/<i>n</i> is called the <a href="Code_rate" title="Code rate">code rate</a>. The fraction <i>k’/k</i>, where <i>k’</i> denotes the number of symbols required for recovery, is called reception efficiency. The recovery algorithm expects that it is known which of the <i>n</i> symbols are lost.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p>Erasure coding was invented by <a href="Irving_Reed" class="mw-redirect" title="Irving Reed">Irving Reed</a> and <a href="Gustave_Solomon" title="Gustave Solomon">Gustave Solomon</a> in 1960.<sup id="cite_ref-xinnor_1-0" class="reference"><a href="#cite_note-xinnor-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p><p>There are many different erasure coding schemes. The most popular erasure codes are
<a href="Reed-Solomon_coding" class="mw-redirect" title="Reed-Solomon coding">Reed-Solomon coding</a>,
<a href="Low-density_parity-check_code" title="Low-density parity-check code">Low-density parity-check code</a> (LDPC codes), and
<a href="Turbo_codes" class="mw-redirect" title="Turbo codes">Turbo codes</a>.<sup id="cite_ref-xinnor_1-1" class="reference"><a href="#cite_note-xinnor-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p><p>As of 2023, modern data storage systems can be designed to tolerate the complete failure of a few disks without data loss, using one of 3 approaches:<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-bdr_3-0" class="reference"><a href="#cite_note-bdr-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-jor_4-0" class="reference"><a href="#cite_note-jor-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>Replication</li>
<li>RAID</li>
<li>Erasure Coding</li></ul>
<p>While technically RAID can be seen as a kind of erasure code,<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
"RAID" is generally applied to an array attached to a single host computer (which is a single point of failure), while "erasure coding" generally implies multiple hosts,<sup id="cite_ref-bdr_3-1" class="reference"><a href="#cite_note-bdr-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
sometimes called a <a href="Redundant_Array_of_Inexpensive_Servers" title="Redundant Array of Inexpensive Servers">Redundant Array of Inexpensive Servers</a> (RAIS).
The erasure code allows operations to continue when any one of those hosts stops.<sup id="cite_ref-jor_4-1" class="reference"><a href="#cite_note-jor-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p><p>Compared to block-level RAID systems, object storage erasure coding has some significant differences that make it more resilient.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Optimal_erasure_codes">Optimal erasure codes</h2></div>

<p>Optimal erasure codes have the property that any <i>k</i> out of the <i>n</i> code word symbols are sufficient to recover the original message (i.e., they have optimal reception efficiency). Optimal erasure codes are <a href="Maximum_distance_separable_code" class="mw-redirect" title="Maximum distance separable code">maximum distance separable codes</a> (MDS codes).
</p>
<div class="mw-heading mw-heading3"><h3 id="Parity_check">Parity check</h3></div>
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">See also: <a href="Parity_bit" title="Parity bit">Parity bit</a></div>
<p>Parity check is the special case where <i>n&nbsp;</i>=&nbsp;<i>k</i>&nbsp;+&nbsp;1. From a set of <i>k</i> values <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \{v_{i}\}_{1\leq i\leq k}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo fence="false" stretchy="false">{</mo>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<msub>
<mo fence="false" stretchy="false">}</mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>i</mi>
<mo>≤<!-- ≤ --></mo>
<mi>k</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \{v_{i}\}_{1\leq i\leq k}}</annotation>
</semantics>
</math></span><img src="./573d09cd0202dd79bfc3942292d22f1db8ec544d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:9.287ex; height:2.843ex;" alt="{\displaystyle \{v_{i}\}_{1\leq i\leq k}}" loading="lazy"></span>, a checksum is computed and appended to the <i>k</i> source values:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v_{k+1}=-\sum _{i=1}^{k}v_{i}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msub>
<mo>=</mo>
<mo>−<!-- − --></mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</munderover>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v_{k+1}=-\sum _{i=1}^{k}v_{i}.}</annotation>
</semantics>
</math></span><img src="./e55976b0f7ab47062c8b911edcd8cb8b96ed5f77.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:15.927ex; height:7.343ex;" alt="{\displaystyle v_{k+1}=-\sum _{i=1}^{k}v_{i}.}" loading="lazy"></span></dd></dl>
<p>The set of <i>k</i>&nbsp;+&nbsp;1 values <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \{v_{i}\}_{1\leq i\leq k+1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo fence="false" stretchy="false">{</mo>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<msub>
<mo fence="false" stretchy="false">}</mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>i</mi>
<mo>≤<!-- ≤ --></mo>
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \{v_{i}\}_{1\leq i\leq k+1}}</annotation>
</semantics>
</math></span><img src="./0baae8ab63c08b79ccb9f0016654cbac2410e6c5.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:11.388ex; height:2.843ex;" alt="{\displaystyle \{v_{i}\}_{1\leq i\leq k+1}}" loading="lazy"></span> is now consistent with regard to the checksum.
If one of these values, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v_{e}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>e</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v_{e}}</annotation>
</semantics>
</math></span><img src="./3271a14c35fc1b6cb549d4d462e8d3255185cc9d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.126ex; height:2.009ex;" alt="{\displaystyle v_{e}}" loading="lazy"></span>, is erased, it can be easily recovered by summing the remaining variables:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v_{e}=-\sum _{i=1,i\neq e}^{k+1}v_{i}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>e</mi>
</mrow>
</msub>
<mo>=</mo>
<mo>−<!-- − --></mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
<mo>=</mo>
<mn>1</mn>
<mo>,</mo>
<mi>i</mi>
<mo>≠<!-- ≠ --></mo>
<mi>e</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</munderover>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v_{e}=-\sum _{i=1,i\neq e}^{k+1}v_{i}.}</annotation>
</semantics>
</math></span><img src="./ad307f6fa582b03f30b2862167c8c081dfb8d7ce.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.505ex; width:16.118ex; height:7.843ex;" alt="{\displaystyle v_{e}=-\sum _{i=1,i\neq e}^{k+1}v_{i}.}" loading="lazy"></span></dd></dl>
<p><a href="RAID_5" class="mw-redirect" title="RAID 5">RAID 5</a> is a widely used application of the parity check erasure code.<sup id="cite_ref-xinnor_1-2" class="reference"><a href="#cite_note-xinnor-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Polynomial_oversampling">Polynomial oversampling</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Example:_Err-mail_(k_=_2)">Example: Err-mail (<i>k</i>&nbsp;=&nbsp;2)</h4></div>
<p>In the simple case where <i>k</i>&nbsp;=&nbsp;2, redundancy symbols may be created by sampling different points along the line between the two original symbols. This is pictured with a simple example, called err-mail:
</p><p><a href="Alice_and_Bob" title="Alice and Bob">Alice</a> wants to send her telephone number (555629) to <a href="Alice_and_Bob" title="Alice and Bob">Bob</a> using err-mail. Err-mail works just like e-mail, except
</p>
<ol><li>About half of all the mail gets lost.</li>
<li>Messages longer than 5 characters are illegal.</li>
<li>It is very expensive (similar to air-mail).</li></ol>
<p>Instead of asking Bob to acknowledge the messages she sends, Alice devises the following scheme.
</p>
<ol><li>She breaks her telephone number up into two parts <i>a</i> = 555, <i>b</i> = 629, and sends 2 messages – "A=555" and "B=629" – to Bob.</li>
<li>She constructs a linear function, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(i)=a+(b-a)(i-1)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>i</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>a</mi>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>b</mi>
<mo>−<!-- − --></mo>
<mi>a</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">(</mo>
<mi>i</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(i)=a+(b-a)(i-1)}</annotation>
</semantics>
</math></span><img src="./787418947869c492a669e3234a995506be6de067.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:24.551ex; height:2.843ex;" alt="{\displaystyle f(i)=a+(b-a)(i-1)}" loading="lazy"></span>, in this case <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(i)=555+74(i-1)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>i</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>555</mn>
<mo>+</mo>
<mn>74</mn>
<mo stretchy="false">(</mo>
<mi>i</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(i)=555+74(i-1)}</annotation>
</semantics>
</math></span><img src="./4d59837a716631513cd3d9446656bbbf61af524e.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:22.256ex; height:2.843ex;" alt="{\displaystyle f(i)=555+74(i-1)}" loading="lazy"></span>, such that <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(1)=555}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>555</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(1)=555}</annotation>
</semantics>
</math></span><img src="./08b0a94af48f47edbb04714c0805744f34903cf9.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.836ex; height:2.843ex;" alt="{\displaystyle f(1)=555}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(2)=629}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mn>2</mn>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mn>629</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(2)=629}</annotation>
</semantics>
</math></span><img src="./f41b533ea5368aae812e068489dba01461e838d1.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.836ex; height:2.843ex;" alt="{\displaystyle f(2)=629}" loading="lazy"></span>.</li></ol>
<p><span class="mw-default-size" typeof="mw:File"></span>
</p>
<ol><li>She computes the values <i>f</i>(3), <i>f</i>(4), and <i>f</i>(5), and then transmits three redundant messages: "C=703", "D=777" and "E=851".</li></ol>
<p>Bob knows that the form of <i>f</i>(<i>k</i>) is <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(i)=a+(b-a)(i-1)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>i</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>a</mi>
<mo>+</mo>
<mo stretchy="false">(</mo>
<mi>b</mi>
<mo>−<!-- − --></mo>
<mi>a</mi>
<mo stretchy="false">)</mo>
<mo stretchy="false">(</mo>
<mi>i</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f(i)=a+(b-a)(i-1)}</annotation>
</semantics>
</math></span><img src="./787418947869c492a669e3234a995506be6de067.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:24.551ex; height:2.843ex;" alt="{\displaystyle f(i)=a+(b-a)(i-1)}" loading="lazy"></span>, where <i>a</i> and <i>b</i> are the two parts of the telephone number.
Now suppose Bob receives "D=777" and "E=851".
</p><p><span class="mw-default-size" typeof="mw:File"></span>
</p><p>Bob can reconstruct Alice's phone number by computing the values of <i>a</i> and <i>b</i> from the values (<i>f</i>(4) and <i>f</i>(5)) he has received.
Bob can perform this procedure using any two err-mails, so the erasure code in this example has a rate of 40%.
</p><p>Note that Alice cannot encode her telephone number in just one err-mail, because it contains six characters, and that the maximum length of one err-mail message is five characters. If she sent her phone number in pieces, asking Bob to acknowledge receipt of each piece, at least four messages would have to be sent anyway (two from Alice, and two acknowledgments from Bob). So the erasure code in this example, which requires five messages, is quite economical.
</p><p>This example is a little bit contrived. For truly generic erasure codes that work over any data set, we would need something other than the <i>f</i>(<i>i</i>) given.
</p>
<div class="mw-heading mw-heading4"><h4 id="General_case">General case</h4></div>
<p>The linear construction above can be generalized to <a href="Polynomial_interpolation" title="Polynomial interpolation">polynomial interpolation</a>. Additionally, points are now computed over a <a href="Finite_field" title="Finite field">finite field</a>.
</p><p>First we choose a finite field <i>F</i> with order of at least <i>n</i>, but usually a power of 2. The sender numbers the data symbols from 0 to <i>k</i>&nbsp;−&nbsp;1 and sends them. He then constructs a <a href="Lagrange_polynomial" title="Lagrange polynomial">(Lagrange) polynomial</a> <i>p</i>(<i>x</i>) of order <i>k</i> such that <i>p</i>(<i>i</i>) is equal to data symbol <i>i</i>. He then sends <i>p</i>(<i>k</i>), ..., <i>p</i>(<i>n</i>&nbsp;−&nbsp;1). The receiver can now also use polynomial interpolation to recover the lost packets, provided he receives <i>k</i> symbols successfully. If the order of <i>F</i> is less than 2<sup><i>b</i></sup>, where b is the number of bits in a symbol, then multiple polynomials can be used.
</p><p>The sender can construct symbols <i>k</i> to <i>n</i>&nbsp;−&nbsp;1 'on the fly', i.e., distribute the workload evenly between transmission of the symbols. If the receiver wants to do his calculations 'on the fly', he can construct a new polynomial <i>q</i>, such that <i>q</i>(<i>i</i>) = <i>p</i>(<i>i</i>) if symbol <i>i</i> &lt; <i>k</i> was received successfully and <i>q</i>(<i>i</i>)&nbsp;=&nbsp;0 when symbol <i>i</i>&nbsp;&lt;&nbsp;<i>k</i> was not received. Now let <i>r</i>(<i>i</i>) = <i>p</i>(<i>i</i>)&nbsp;−&nbsp;<i>q</i>(<i>i</i>). Firstly we know that <i>r</i>(<i>i</i>)&nbsp;=&nbsp;0 if symbol <i>i</i> &lt; <i>k</i> has been received successfully. Secondly, if symbol <i>i</i>&nbsp;≥&nbsp;<i>k</i> has been received successfully, then <i>r</i>(<i>i</i>)&nbsp;=&nbsp;<i>p</i>(<i>i</i>)&nbsp;−&nbsp;<i>q</i>(<i>i</i>) can be calculated. So we have enough data points to construct <i>r</i> and evaluate it to find the lost packets. So both the sender and the receiver require <i>O</i>(<i>n</i> (<i>n</i>&nbsp;−&nbsp;<i>k</i>)) operations and only <i>O</i>(<i>n</i>&nbsp;−&nbsp;<i>k</i>) space for operating 'on the fly'.
</p>
<div class="mw-heading mw-heading4"><h4 id="Real_world_implementation">Real world implementation</h4></div>
<p>This process is implemented by <a href="Reed%E2%80%93Solomon_code" class="mw-redirect" title="Reed–Solomon code">Reed–Solomon codes</a>, with code words constructed over a <a href="Finite_field" title="Finite field">finite field</a> using a <a href="Vandermonde_matrix" title="Vandermonde matrix">Vandermonde matrix</a>.
</p><p>Most practical erasure codes are <a href="Systematic_code" title="Systematic code">systematic codes</a> -- each one of the original <i>k</i> symbols can be found copied, unencoded, as one of the <i>n</i> message symbols.<sup id="cite_ref-vinayak_12-0" class="reference"><a href="#cite_note-vinayak-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
(Erasure codes that support <a href="Secret_sharing" title="Secret sharing">secret sharing</a> never use a systematic code).
</p>
<div class="mw-heading mw-heading2"><h2 id="Near-optimal_erasure_codes">Near-optimal erasure codes</h2></div>
<p><i>Near-optimal erasure codes</i> require (1&nbsp;+&nbsp;ε)<i>k</i> symbols to recover the message (where ε&gt;0). Reducing ε can be done at the cost of CPU time.
<i>Near-optimal erasure codes</i> trade correction capabilities for computational complexity: practical algorithms can encode and decode with linear time complexity.
</p><p><a href="Fountain_code" title="Fountain code">Fountain codes</a> (also known as <i>rateless erasure codes</i>) are notable examples of <i>near-optimal erasure codes</i>. They can transform a <i>k</i> symbol message into a practically infinite encoded form, i.e., they can generate an arbitrary amount of redundancy symbols that can all be used for error correction. Receivers can start decoding after they have received slightly more than <i>k</i> encoded symbols.
</p><p>Regenerating codes address the issue of rebuilding (also called repairing) lost encoded fragments from existing encoded fragments. This issue occurs in distributed
storage systems where communication to maintain encoded redundancy is a problem.<sup id="cite_ref-vinayak_12-1" class="reference"><a href="#cite_note-vinayak-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Applications_of_erasure_coding_in_storage_systems">Applications of erasure coding in storage systems</h2></div>
<p>Erasure coding is now standard practice for reliable data storage.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-bbeach_15-0" class="reference"><a href="#cite_note-bbeach-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>
In particular, various implementations of Reed-Solomon erasure coding are used by <a href="Apache_Hadoop" title="Apache Hadoop">Apache Hadoop</a>, the <a href="RAID-6" class="mw-redirect" title="RAID-6">RAID-6</a> built into Linux, Microsoft Azure, Facebook cold storage, and Backblaze Vaults.<sup id="cite_ref-bbeach_15-1" class="reference"><a href="#cite_note-bbeach-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-vinayak_12-2" class="reference"><a href="#cite_note-vinayak-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p><p>The classical way to recover from failures in storage systems was to use replication. However, replication incurs significant overhead in terms of wasted bytes. Therefore, increasingly large storage systems, such as those used in data centers use erasure-coded storage. The most common form of erasure coding used in storage systems is <a href="Reed%E2%80%93Solomon_error_correction" title="Reed–Solomon error correction">Reed-Solomon (RS) code</a>, an advanced mathematics formula used to enable regeneration of missing data from pieces of known data, called parity blocks. In a (<i>k</i>,&nbsp;<i>m</i>) RS code, a given set of <i>k</i> data blocks, called "chunks", are encoded into (<i>k</i>&nbsp;+&nbsp;<i>m</i>) chunks. The total set of chunks comprises a <i>stripe</i>. The coding is done such that as long as at least <i>k</i> out of (<i>k</i>&nbsp;+&nbsp;<i>m</i>) chunks are available, one can recover the entire data. This means a (<i>k</i>,&nbsp;<i>m</i>) RS-encoded storage can tolerate up to <i>m</i> failures.
</p><p><b>Example:</b> In RS (10,&nbsp;4) code, which is used in Facebook for their <a href="HDFS" class="mw-redirect" title="HDFS">HDFS</a>,<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup> 10 MB of user data is divided into ten 1MB blocks. Then, four additional 1 MB parity blocks are created to provide redundancy. This can tolerate up to 4 concurrent failures. The storage overhead here is 14/10 = 1.4X.
</p><p>In the case of a fully replicated system, the 10 MB of user data will have to be replicated 4 times to tolerate up to 4 concurrent failures. The storage overhead in that case will be 50/10&nbsp;=&nbsp;5 times.
</p><p>This gives an idea of the lower storage overhead of erasure-coded storage compared to full replication and thus the attraction in today's storage systems.
</p><p>Initially, erasure codes were used to reduce the cost of storing "cold" (rarely-accessed) data efficiently; but erasure codes can also be used to improve performance serving "hot" (more-frequently-accessed) data.<sup id="cite_ref-vinayak_12-3" class="reference"><a href="#cite_note-vinayak-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p><p><a href="RAID" title="RAID">RAID</a> N+M divides data blocks across N+M drives, and can recover all the data when any M drives fail.<sup id="cite_ref-xinnor_1-3" class="reference"><a href="#cite_note-xinnor-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
In particular, RAID 7.3 refers to triple-parity RAID, and can recover all the data when any 3 drives fail.<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<p>Here are some examples of implementations of the various codes:
</p>
<div class="mw-heading mw-heading3"><h3 id="Near_optimal_erasure_codes">Near optimal erasure codes</h3></div>
<ul><li><a href="Tornado_codes" class="mw-redirect" title="Tornado codes">Tornado codes</a></li>
<li><a href="Low-density_parity-check_codes" class="mw-redirect" title="Low-density parity-check codes">Low-density parity-check codes</a></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Near_optimal_fountain_(rateless_erasure)_codes">Near optimal fountain (rateless erasure) codes</h3></div>
<ul><li><a href="Fountain_code" title="Fountain code">Fountain code</a></li>
<li><a href="Online_codes" title="Online codes">Online codes</a></li>
<li><a href="LT_codes" class="mw-redirect" title="LT codes">LT codes</a></li>
<li><a href="Raptor_codes" class="mw-redirect" title="Raptor codes">Raptor codes</a></li>
<li><a href="Linear_network_coding" title="Linear network coding">Network Codes</a></li>
<li><a href="Triangular_network_coding" title="Triangular network coding">Triangular codes</a></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Optimal_erasure_codes_2">Optimal erasure codes</h3></div>
<ul><li><a href="Parity_(telecommunication)" class="mw-redirect" title="Parity (telecommunication)">Parity</a>: used in <a href="RAID" title="RAID">RAID</a> storage systems.</li>
<li><a href="Parchive" title="Parchive">Parchive</a></li>
<li><a href="Tahoe-LAFS" title="Tahoe-LAFS">Tahoe-LAFS</a> includes <a rel="nofollow" class="external text" href="https://pypi.python.org/pypi/zfec">zfec</a></li>
<li><a href="Reed%E2%80%93Solomon" class="mw-redirect" title="Reed–Solomon">Reed–Solomon codes</a></li>
<li><a rel="nofollow" class="external text" href="http://switzernet.com/people/emin-gabrielyan/051103-erasure-9-5-resilient/">Erasure Resilient Systematic Code</a>, an MDS code outperforming Reed–Solomon in the maximal number of redundant packets, see <a rel="nofollow" class="external text" href="http://switzernet.com/people/emin-gabrielyan/051025-erasure-resilient/">RS(4,2) with 2 bits</a> or <a rel="nofollow" class="external text" href="http://switzernet.com/people/emin-gabrielyan/051027-erasure-9-2-resilient/">RS(9,2) with 3 bits</a></li>
<li>Regenerating Codes<sup id="cite_ref-regcodes_18-0" class="reference"><a href="#cite_note-regcodes-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-19" class="reference"><a href="#cite_note-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup></li>
<li>any other <a href="Maximum_distance_separable_code" class="mw-redirect" title="Maximum distance separable code">maximum distance separable code</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Forward_error_correction" class="mw-redirect" title="Forward error correction">Forward error correction</a> codes.</li>
<li><a href="Secret_sharing" title="Secret sharing">Secret sharing</a> (differs in that the original secret is encrypted and obscured until the decode quorum is reached)</li>
<li><a href="Spelling_alphabet" title="Spelling alphabet">Spelling alphabet</a></li>
<li><a href="Binary_erasure_channel" title="Binary erasure channel">Binary erasure channel</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-xinnor-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-xinnor_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-xinnor_1-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-xinnor_1-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-xinnor_1-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text">
<style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://xinnor.io/blog/a-guide-to-raid-pt-4-raid-vs-erasure-coding-whats-the-difference/">"RAID vs. Erasure Coding. What's the Difference? | Blog | Xinnor"</a>. <i>The Fastest and Most Reliable Software RAID | Xinnor</i>. 2023-09-03<span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://ceph.io/en/news/blog/2014/erasure-coding-in-ceph-2/">"Ceph.io — Erasure Coding in Ceph"</a>. <i>ceph.io</i>. 2014-04-07<span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-bdr-3"><span class="mw-cite-backlink">^ <a href="#cite_ref-bdr_3-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-bdr_3-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text">
<cite id="CITEREFLee2023" class="citation web cs1">Lee, Brandon (2023-12-26). <a rel="nofollow" class="external text" href="https://www.bdrsuite.com/blog/raid-vs-erasure-coding-vs-replication/">"RAID vs Erasure Coding vs Replication"</a>. <i>BDRSuite</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-jor-4"><span class="mw-cite-backlink">^ <a href="#cite_ref-jor_4-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-jor_4-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text">
<cite id="CITEREFO'Reilly" class="citation web cs1">O'Reilly, Jim. <a rel="nofollow" class="external text" href="https://www.networkcomputing.com/data-center-networking/raid-vs-erasure-coding">"RAID Vs. Erasure Coding"</a>. <i>www.networkcomputing.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text">
Dimitri Pertin, Alexandre van Kempen, Benoît Parrein, Nicolas Normand. <a rel="nofollow" class="external text" href="https://hal.science/hal-01162047/document">"Comparison of RAID-6 Erasure Codes"</a>.
The third Sino-French Workshop on Information and Communication Technologies,
SIFWICT 2015, Jun 2015, Nantes, France. ffhal-01162047f</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.ibm.com/docs/en/storage-scale-ece/5.1.3?topic=issece-understanding-spectrum-scale-erasure-code-edition-fault-tolerance">"Understanding IBM Spectrum Scale Erasure Code Edition fault tolerance"</a>. <i>www.ibm.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://blog.min.io/erasure-coding-vs-raid/">"Object Storage Erasure Coding vs. Block Storage RAID"</a>. <i>MinIO Blog</i>. 2021-07-27<span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.computerweekly.com/feature/Erasure-coding-versus-RAID-as-a-data-protection-method">"Erasure coding vs Raid as a data protection method | Computer Weekly"</a>. <i>ComputerWeekly.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text">
<cite id="CITEREFKruth2023" class="citation web cs1">Kruth, Peter (2023-10-04). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20231004193238/https://blog.huawei.com/2021/11/30/erasure-code-raid-as-it-should-be/">"Erasure Code: RAID As It Should Be – Huawei BLOG"</a>. Archived from <a rel="nofollow" class="external text" href="https://blog.huawei.com/2021/11/30/erasure-code-raid-as-it-should-be/">the original</a> on 2023-10-04<span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text">
<cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://blog.min.io/erasure-coding/">"Erasure Coding 101"</a>. <i>MinIO Blog</i>. 2022-04-25<span class="reference-accessdate">. Retrieved <span class="nowrap">2024-09-18</span></span>.</cite></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text">
<cite id="CITEREFBhaskaran2018" class="citation web cs1">Bhaskaran, Dinesh Kumar (July 6, 2018). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200807015110/https://www.datacenterdynamics.com/en/opinions/why-erasure-coding-is-the-future-of-data-resiliency/">"Why erasure coding is the future of data resiliency"</a>. Archived from <a rel="nofollow" class="external text" href="https://www.datacenterdynamics.com/en/opinions/why-erasure-coding-is-the-future-of-data-resiliency/">the original</a> on August 7, 2020.</cite></span>
</li>
<li id="cite_note-vinayak-12"><span class="mw-cite-backlink">^ <a href="#cite_ref-vinayak_12-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-vinayak_12-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-vinayak_12-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-vinayak_12-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text">
Rashmi Vinayak.
<a rel="nofollow" class="external text" href="https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-155.html">"Erasure Coding for Big-data Systems: Theory and Practice"</a>.
2016.
p. 2: section "Abstract".
p. 9: section "Systematic codes".
p. 12: section "Regenerating codes".</span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text">
<a rel="nofollow" class="external text" href="https://www.usenix.org/conference/fast16/training-program/session/erasure-encoding%E2%80%94practice-and-principles">"Erasure Encoding—Practice and Principles"</a>.
2016.</span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text">
Matt Sarrel.
<a rel="nofollow" class="external text" href="https://blog.min.io/erasure-coding/">"Erasure Coding 101"</a>.
2022.</span>
</li>
<li id="cite_note-bbeach-15"><span class="mw-cite-backlink">^ <a href="#cite_ref-bbeach_15-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-bbeach_15-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text">
Brian Beach.
<a rel="nofollow" class="external text" href="https://www.backblaze.com/blog/reed-solomon/">"Backblaze Open-sources Reed-Solomon Erasure Coding Source Code"</a>.
2015.</span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><cite id="CITEREFXiaSaxenaBlaumPease2015" class="citation book cs1">Xia, Mingyuan; Saxena, Mohit; Blaum, Mario; Pease, David A. (2015). <a rel="nofollow" class="external text" href="https://www.usenix.org/conference/fast15/technical-sessions/presentation/xia"><i>A Tale of Two Erasure Codes in {HDFS}</i></a>. pp.&nbsp;<span class="nowrap">213–</span>226. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>978-1-931971-20-1</bdi>.</cite></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text">
Adam Leventhal.
<a rel="nofollow" class="external text" href="https://dl.acm.org/doi/pdf/10.1145/1661785.1670144">""Triple-parity RAID and beyond"</a>.
2009.</span>
</li>
<li id="cite_note-regcodes-18"><span class="mw-cite-backlink"><b><a href="#cite_ref-regcodes_18-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFDimakisGodfreyWuWainwright2010" class="citation journal cs1">Dimakis, Alexandros G.; Godfrey, P. Brighten; Wu, Yunnan; Wainwright, Martin J.; Ramchandran, Kannan (September 2010). "Network Coding for Distributed Storage Systems". <i>IEEE Transactions on Information Theory</i>. <b>56</b> (9): <span class="nowrap">4539–</span>4551. <a href="ArXiv_(identifier)" class="mw-redirect" title="ArXiv (identifier)">arXiv</a>:<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://arxiv.org/abs/cs/0702015">cs/0702015</a></span>. <a href="CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a>&nbsp;<span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.117.6892">10.1.1.117.6892</a></span>. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1109%2FTIT.2010.2054295">10.1109/TIT.2010.2054295</a>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a>&nbsp;<a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:260559901">260559901</a>.</cite></span>
</li>
<li id="cite_note-19"><span class="mw-cite-backlink"><b><a href="#cite_ref-19">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20170731144507/http://storagewiki.ece.utexas.edu/doku.php">"home [Erasure Coding for Distributed Storage Wiki]"</a>. 2017-07-31. Archived from <a rel="nofollow" class="external text" href="http://storagewiki.ece.utexas.edu/doku.php">the original</a> on 2017-07-31<span class="reference-accessdate">. Retrieved <span class="nowrap">2023-08-20</span></span>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://jerasure.org/">Jerasure</a> is a Free Software library implementing Reed-Solomon and Cauchy erasure code techniques with SIMD optimisations.</li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20160303184031/http://info.iet.unipi.it/~luigi/fec.html">Software FEC in computer communications</a> by Luigi Rizzo describes optimal erasure correction codes</li>
<li><a rel="nofollow" class="external text" href="http://feclib.sourceforge.net">Feclib</a> is a near optimal extension to Luigi Rizzo's work that uses band matrices. Many parameters can be set, like the size of the width of the band and size of the finite field. It also successfully exploits the large <a href="Processor_register" title="Processor register">register</a> size of modern CPUs. How it compares to the near optimal codes mentioned above is unknown.</li>
<li><a rel="nofollow" class="external text" href="https://archive.today/20140620164304/http://storagewiki.ece.utexas.edu/?id=wiki:definitions:repair_problem">Coding for Distributed Storage wiki</a> for regenerating codes and rebuilding erasure codes.</li>
<li><a rel="nofollow" class="external text" href="http://ecip.org/">ECIP "Erasure Code Internet Protocol"</a> Developed in 1996, was the first use of FEC "Forward Error correction" on the Internet. It was first used commercially to *<a rel="nofollow" class="external text" href="http://www.dnull.com/~sokol/clarke.html">stream live video of Sir Arthur C. Clarke in Sri Lanka to UIUC in Indiana</a>.</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-06-30" href="https://en.wikipedia.org/wiki/?title=Erasure_code&amp;oldid=1298047069">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>